#pragma once
#ifndef __DICTIONARY_HPP__
#define __DICTIONARY_HPP__
#include <unordered_map>
#include <string>
#include <iostream>
#include<stdio.h>
#include"log.hpp"

using namespace LogModule;

const std::string dataname = "data.txt"; // 定义好我们存储字典数据的文件名
const std::string defaultpath = "./";           // 定义好我们存储字典数据的路径

class dictionary
{
public:
    dictionary(const std::string filename=dataname,std::string path=defaultpath)
    :_filename(filename),
    _path(path)
    {
    }
    ~dictionary() {}
    bool Split(std::string &line,std::string *word,std::string *value,const std::string sep)
    {
        int pos= line.find(sep);// 找到：的位置
        if(pos==std::string::npos)//没找到
        {
            return false;
        }

        *word=line.substr(0,pos);//pos找到之后所指向的位置就是:的位置，substr是一个左闭右开区间
        *value = line.substr(pos+sep.size());// 从pos+sep.size()开始截取，直到字符串结束
        if(value->empty()||word->empty())
        {
            return false; // 如果截取的值为空，返回false
        }
        return true;
    }
    bool LoadDictionary() // 我们需要一个函数来加载字典数据，初始化我们的字典对象，填充字典数据到哈希表里
    {
        std::string filepath=_path+_filename; // 拼接文件路径和文件名
        std::ifstream fd(filepath.c_str()); // 打开文件,默认以读取方式打开

        if(!fd.is_open())
        {
            LOG(LogLevel::ERROR)<<"Failed to open dictionary file: " << filepath;
            return false; // 如果文件打开失败，返回false
        }
        std::string line;
        while(getline(fd,line))
        {
            std::string word,value;
            if(Split(line,&word,&value,": ")) // 假设我们用:来分隔单词和释义
            {
                dict[word]=value; // 将单词和释义存入哈希表
            }
        }
        return true; // 如果加载成功，返回true
    }
    std::string Translate(const std::string &word) // 我们之后用这个函数来实现一个翻译的功能
    {
        auto it=dict.find(word);
        if(it != dict.end()) // 如果找到了这个单词
        {
            return it->second; // 返回对应的释义
        }
        else
        {
            LOG(LogLevel::WARN)<<"Word not found: " << word;
            return "Not found"; // 如果没找到，返回一个默认值
        }
    }

private:
    std::unordered_map<std::string, std::string> dict;
    std::string _filename;
    std::string _path;// 我们可以把文件名和路径都存储在字典对象里
};

#endif